﻿
using PacoToolKit.Format;
namespace Protocol.SouthGridProtocol.Decoder
{
    /// <summary>
    /// 基础帧内容解析器
    /// </summary>
    public class BaseDecoder
    {
        public static string GetC(string msg)
        {
            return msg.Substring(12, 2);
        }
        public static string GetAFN(string msg)
        {
            return msg.Substring(28, 2);
        }
        public static string GetSEQ(string msg)
        {
            return msg.Substring(30, 2);
        }
        public static string GetConcentrator(string msg)
        {
            return msg.Substring(14, 12);
        }
        /// <summary>
        /// 地址域，7字节
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static string GetAddressDomain(string msg)
        {
            return msg.Substring(14, 14);
        }
        public static bool IsCorrectMsg(string msg)
        {
            if (msg.Length < 48)
            {
                return false;
            }
            //判断头
            if (!msg.Substring(0, 2).Equals("68"))
            {
                return false;
            }
            //判断第二个68
            if (!msg.Substring(10, 2).Equals("68"))
            {
                return false;
            }
            //判断尾
            if (!msg.Substring(msg.Length - 2, 2).Equals("16"))
            {
                return false;
            }
            string dataString = msg.Substring(12, msg.Length - 12 - 4);
            string csString = Formater.CalcCSCode(Formater.HexStringToBytesKeep(dataString)).ToString("X2");
            string receiveCsString = msg.Substring(msg.Length - 4, 2);
            if (!csString.Equals(receiveCsString))
            {
                return false;
            }
            return true;
        }
        public static bool IsUpLine(string msg)
        {
            int c = int.Parse(Formater.HEXtoDEC(GetC(msg)));
            return (c >= 128) ? true : false;
        }
        public static int GetLength(string msg)
        {
            return int.Parse(Formater.HEXtoDEC(Formater.ReverseHexString(msg.Substring(2, 4))));
        }
        /// <summary>
        /// 根据da(低在前，高在后)内容计算出tn值
        /// </summary>
        /// <param name="da"></param>
        /// <returns></returns>
        public static string CalcTn(string da)
        {
            string da1 = da.Substring(0, 2);
            int da2 = int.Parse(Formater.HEXtoDEC(da.Substring(2, 2)));
            if (da1.Equals("80"))
            {
                return (da2 * 8).ToString();
            }
            else if (da1.Equals("40"))
            {
                return (7 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("20"))
            {
                return (6 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("10"))
            {
                return (5 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("08"))
            {
                return (4 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("04"))
            {
                return (3 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("02"))
            {
                return (2 + (da2 - 1) * 8).ToString();
            }
            else if (da1.Equals("01"))
            {
                return (1 + (da2 - 1) * 8).ToString();
            }
            else
                return "0";
        }
    }
}
